package thread;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 74646
 * Date: 2022-04-28
 * Time: 8:07
 */

public class TestDemo13 {
    private static final long COUNT = 10_0000_0000L;

    /**
     * 一个线程对两个变量自增 10 亿次所花费的时间
     */
    public static void serial(){
        // 记录程序自增的开始时间
        long begin = System.currentTimeMillis();
        // 自增变量a
        long a = 0;
        for(long i = 0;i<COUNT;i++){
            a++;
        }
        // 自增变量b
        long b = 0;
        for(long i = 0;i<COUNT;i++){
            b++;
        }
        // 记录程序自增的结束时间
        long end = System.currentTimeMillis();
        System.out.println("一个线程所花费的时间："+(end-begin)+"ms");
    }

    /**
     * 两个线程对两个变量自增 10 亿次所花费的时间
     */
    public static void concurrency(){
        // 记录程序自增的开始时间
        long begin = System.currentTimeMillis();
        // 创建 t1 线程对变量a进行自增
        Thread t1 = new Thread(()->{
            long a = 0;
            for (long i = 0; i < COUNT; i++) {
                a++;
            }
        });
        t1.start();

        // 创建 t2 线程对变量b进行自增
        Thread t2 = new Thread(()->{
            long b = 0;
            for (long i = 0; i <COUNT ; i++) {
                b++;
            }
        });
        t2.start();

        /**
         * 这里不能直接记录程序的结束时间，因为这个时间戳的代码是在 main 线程中
         * main 线程与 t1、t2 线程之间是并发执行
         * 所以需要 main 线程等待 t1、t2 线程执行结束后，再记录结束时间
         */

        // join：等待线程结束
        try {
            t1.join(); // 等待 t1 线程结束
            t2.join(); // 等待 t2 线程结束
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        // 记录程序自增的结束时间
        long end = System.currentTimeMillis();
        System.out.println("两个线程所花费的时间："+(end-begin)+"ms");

    }

    public static void main(String[] args) {
        // 计算一个线程所花费的时间
        serial();

        // 计算两个线程所花费的时间
        concurrency();
    }
}
